Introduzione

Ho deciso di analizzare un dataset chiamato polbooks realizzato da Valdis Krebs, contenente informazioni su libri di politica americana e le vendite di questi su Amazon.com per cercare di capire meglio in che rapporti sono i differenti schieramenti politici e quali sono le rispettive abitudini di acquisto, in particolare cercando di rispondere ai seguenti quesiti:

  1. Quali libri ricevono il maggior numero di suggerimenti d’acqusito da parte di altri libri, quali invece suggeriscono l’acquisto di più libri?
  2. Quali sono i libri più influenti della rete?
  3. Quanto sono propensi i vari schieramenti a suggerire l’acquisto di libri di schieramenti diversi dal proprio?
  4. Quali sono gli schieramenti che comunicano maggiormente?
  5. Quali sono i libri che comunicano maggiormente con schieramenti diversi dal proprio?
  6. Quali sono gli hub e le authority della rete?

Data Preparation & Exploration

Carichiamo il dataframe polbooks e rendiamolo un grafo diretto:

g <- read.graph("polbooks.gml", format = "gml")
g_el <- as_edgelist(g)
edges <- data.frame( from = g_el[,1], to = g_el[,2])
nodes <- data.frame( name = seq(1,105), value = V(g)$value, label= V(g)$label)

g2 = graph_from_data_frame(edges, directed = TRUE, vertices = nodes)

Visualizziamo la rete completa:

colours <- replace(V(g2)$value,V(g2)$value =="n","#ffffff")
colours <- replace(colours,colours =="c","#e60800")
colours <- replace(colours,colours =="l","#1220e8")
nodes1 <- data.frame( id = nodes[,1], label = nodes[,3], color = colours)

visNetwork(nodes1, edges) %>%
 visEdges(arrows = 'from', scaling = list(min = 2, max = 2))%>%
  visOptions(highlightNearest = TRUE, nodesIdSelection = list(enabled = TRUE,useLabels = TRUE))

Entriamo ora nel dettaglio di com’è costituita la rete.

Numero di contenuti nella rete:

length(V(g2))
## [1] 105

Ognuno di questi nodi rappresenta un libro che tratta argomenti di politica americana in vendita su Amazon.com. Come ad esempio:

head(V(g2)$label)
## [1] "1000 Years for Revenge"     "Bush vs. the Beltway"      
## [3] "Charlie Wilson's War"       "Losing Bin Laden"          
## [5] "Sleeping With the Devil"    "The Man Who Warned America"

Inoltre ogni nodo è stato etichettato da Mark Newman a partire dalla descrizione e dalle recensioni del libro presenti su Amazon.com con un valore per indicare lo schieramento politico di appartenenza, ovvero se il libro è neurale,conservatore o liberale.

unique(V(g2)$value);
## [1] "n" "c" "l"

Il numero di archi presenti nel dataset è pari a

length(E(g2));
## [1] 441

Un arco va da un nodo A ad un nodo B, se tipicamente un utente che acquista il libro A su Amazon.com, acquista anche il libro B. Di fatto rappresenta la feature “chi ha comprato questo libro ha comprato anche questi libri” presente su Amazon.com.

Ad esempio chi ha comprato

V(g2)$label[edges[rnd,1]]
## [1] "Hegemony or Survival"
V(g2)$value[edges[rnd,1]]
## [1] "l"

ha comprato anche

V(g2)$label[edges[rnd,2]]
## [1] "Dude, Where's My Country?"
V(g2)$value[edges[rnd,2]]
## [1] "l"

Vediamo ora com’è ripartita la rete in base agli schieramenti politici di appartenenza di ogni libro.

table(V(g2)$value)
## 
##  c  l  n 
## 49 43 13

Come si può notare la numerosità di libri conservatori e liberali è molto simile, mentre i libri neutrali sono presenti in quantità notevolmente minore.

barplot(table(V(g2)$value),ylim=c(0,50), col = c("#e60800", "#0033ed", "#ffffff"), names.arg=c("conservative","liberal","neutral"))

Analizziamo la distribuzione del grado entrante della rete, ossia la frequenza d’acquisto di un libro grazie ai suggerimenti.

in_degree = degree(g2, mode = "in")
in_dist = table(in_degree)
barplot(in_dist / sum(in_dist), xlab="Degree", ylab="Frequency")

summary(in_degree)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     3.0     4.0     4.2     5.0    17.0
skewness = function(x) mean( ((x - mean(x)) / sd(x))^3 )
skewness(in_degree)
## [1] 1.774835

Come si può notare dal barplot e dall’indice di skewness, la distribuzione non è simmetrica ma presenta un’asimmetria a sinistra.

Mentre la distribuzione del grado uscente rappresenta la varietà di libri acquistati solitamente da chi compra un determinato libro.

out_degree = degree(g2, mode = "out")
out_dist = table(out_degree)
barplot(out_dist / sum(out_dist), xlab="Degree", ylab="Frequency")

summary(out_degree)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     1.0     2.0     4.2     5.0    24.0
skewness(out_degree)
## [1] 1.905073

In questo caso l’asimmetria è ancora più evidente, indice della presenza di pochi nodi di “successo”.

Quesiti

Cerchiamo ora di rispondere ai questi riportati sopra.

a.

Quali libri ricevono il maggior numero di suggerimenti d’acqusito da parte di altri libri, quali invece suggeriscono l’acquisto di più libri?

I libri più acquistati anche grazie alla raccomandazione diretta da parte di altri libri, ovvero quei libri con il maggior numero di archi entranti.

in_degree = degree(g2,mode="in")

barplot(sort(in_degree), col = colours[order(in_degree)], xaxt='n', ann=FALSE)

 

Come si evince dal barplot è un titolo conservatore quello con grado più alto, tale libro è

max_in_degree = which(in_degree==max(in_degree))
mid_title <- V(g2)$label[max_in_degree]
mid_value <- V(g2)$value[max_in_degree]
mid_degree <- max(in_degree)
cbind( "title" = mid_title , "value" = mid_value, "degree" = mid_degree)
##      title       value degree
## [1,] "Arrogance" "c"   "17"

 

Per farsi un idea generale si può controllare di che schieramenti fanno parte i libri che tra i loro suggerimenti d’acquisto contengono proprio questo libro.

t48 <- as_tibble(edges) %>%
                  filter(to == 48)
V(g2)[t48$from]$value
##  [1] "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "n" "c" "c" "c" "c"

Non sorprende che la quasi totalità di libri appartiene allo schieramento conservatore-

 

Visualiziamo invece il grado entrante medio di ogni schieramento.

l_idx <- V(g2)[which(V(g)$value=="l")]
n_idx <- V(g2)[which(V(g)$value=="n")]
c_idx <- V(g2)[which(V(g)$value=="c")]


mean_id <- data.frame( n = sum(in_degree[n_idx])/length(n_idx), c = sum(in_degree[c_idx])/length(c_idx), l = sum(in_degree[l_idx])/length(l_idx))
mmean_id <- as.matrix(mean_id)
barplot(mmean_id[1,], col = c("#ffffff","#e60800", "#0033ed" ), names.arg=c("neutral","conservative","liberal"))

 

Notiamo che quando si parla di grado medio relativamente ai diversi schieramenti politici la situazione è abbastanza simile per quanto riguarda liberali e conservatori mentre i libri neutrali beneficiano in misura minore degli acquisti avvenuti grazie alla funzione di consiglio libri.

Similmente possiamo trovare i nodi con out degree maggiore, ovvero i libri che spingono all’acquisto del maggior numero di libri presenti nella propria sezione di libri suggeriti.

out_degree = degree(g2,mode="out")

barplot(sort(out_degree), col = colours[order(out_degree)], xaxt='n', ann=FALSE)

 

Troviamo ora il libro con out-degree massimo e il suo schieramento di appartenenza.

max_out_degree = which(out_degree==max(out_degree))
mod_title <- V(g2)$label[max_out_degree]
mod_value <- V(g2)$value[max_out_degree]
mod_degree <- max(out_degree)
cbind( "title" = mod_title , "value" = mod_value, "degree" = mod_degree)
##      title                      value degree
## [1,] "A National Party No More" "c"   "24"

Mentre il grado medio per fazione politica è:

#Grado medio
mean_od <- data.frame( n = sum(out_degree[n_idx])/length(n_idx), c = sum(out_degree[c_idx])/length(c_idx), l = sum(out_degree[l_idx])/length(l_idx))
mmean_od <- as.matrix(mean_od)
barplot(mmean_od[1,], col = c("#ffffff","#e60800", "#0033ed" ), names.arg=c("neutral","conservative","liberal"))

 

Nonostate i tre libri con grado massimo siano conservatori il grado medio di tutti e tre gli schieramenti è abbastanza simile in particolar modo quello di liberali e conservatori.

Potrebbe essere interessante trovare il libro o i libri che innescano la più lunga catena di raccomandazioni

d = get_diameter(g2)
d
## + 9/105 vertices, named, from 33b2988:
## [1] 22 24 28 41 54 77 84 88 99

d$value
## [1] "c" "c" "c" "c" "c" "n" "l" "l" "l"

Questo titolo genera una sequenza di 8 acquisti, e come si può notare nonostante sia un libro conservatore indirettamente reca vantaggio anche ad schieramento avversario come può esserlo quello liberale.

b.

Quali sono i libri più influenti della rete?

Possiamo rispondere a questa domanda calcolando la Eigenvector Centrality, i nodi con grado maggiore saranno infatti quelli più influenti, dove con più influenti si intendono quei libri che vengono acquistati maggiormente grazie al fatto di essere molto suggeriti ma soprattutto di essere suggeri da i libri che a loro volta vengono acquistati spesso.

ec <- eigen_centrality(g2)$vector
wnodes <- nodes
wnodes["weight"] <- ec
g3 = graph_from_data_frame(edges, directed = TRUE, vertices = wnodes)
ggraph(g3) +
  geom_edge_link(arrow = arrow(length = unit(2, 'mm'), type = "open"),end_cap = circle(0.5, 'mm'), alpha = 0.4, show.legend = FALSE) +
  geom_node_point(aes(color = value, size = weight))  +
  theme_graph()

barplot(sort(ec), col = colours[order(ec)], xaxt='n', ann=FALSE)

 

Dai grafici si evince un grado d’influenza dei libri liberali nettamente maggiore rispetto agli altri. Verifichiamo se ciò è vero confrontando il grado d’influenza medio di ogni schieramento.  

mean_ec <- data.frame( n = sum(ec[n_idx])/length(n_idx), c = sum(ec[c_idx])/length(c_idx), l = sum(ec[l_idx])/length(l_idx))
mmean_ec <- as.matrix(mean_ec)
barplot(mmean_ec[1,], col = c("#ffffff","#e60800", "#0033ed" ), names.arg=c("neutral","conservative","liberal"), ylim=c(0,0.5))

 

Effettivamente quanto supposto è vero, di conseguenza, se consideriamo l’eigenvector centrality per determinare l’influenza, quella dei libri liberali è nettamente superiore a quella dei neutrali e conservatori, i quali in questo caso sono molto simili tra loro. Questo significa appunto che i libri liberali esercitano una maggiore influenza sulla rete e dunque impattano in maniera maggiore sugli acquisti in generale.

c.

Quanto sono propensi i vari schieramenti a suggerire l’acquisto di libri di schieramenti diversi dal proprio?

Passiamo ora a ragionare in maniera più astratta creando un grafo pesato diretto composto da tre nodi, uno per ogni schieramento. Il peso di ogni arco indicherà il numero di archi ve vanno dallo schieramento del nodo di partenza a quello del nodo di arrivo. Così facendo è facile vedere come i diversi schieramenti interagiscano tra loro.

nedges11 <- replace(edges[,1],edges[,1] %in% l_idx,"l")
nedges21 <- replace(nedges11, nedges11 %in% n_idx,"n")
nedges31 <- replace(nedges21, nedges21 %in% c_idx,"c")
nedges12 <- replace(edges[,2],edges[,2] %in% l_idx,"l")
nedges22 <- replace(nedges12, nedges12 %in% n_idx,"n")
nedges32 <- replace(nedges22, nedges22 %in% c_idx,"c")

nedges <- data.frame( from = nedges31, to = nedges32)
nnodes <- data.frame( name = c("l","n","c"), value = c("l","n","c"))
ng = graph_from_data_frame(nedges, directed = TRUE, vertices = nnodes)
gng <- graph.adjacency(get.adjacency(ng),weighted=TRUE)
plot(gng, edge.label=E(gng)$weight, edge.curved=TRUE)

 

Analizziamo la rete ottenuta. Qui sotto possiamo trovare una tabella riassuntiva del numero di archi tra le possibili coppie di schieramenti.

w_table <- cbind( get.edgelist(gng) , E(gng)$weight)
colnames(w_table) <- c("from", "to", "edges")
w_table
##       from to  edges
##  [1,] "l"  "l" "172"
##  [2,] "n"  "l" "14" 
##  [3,] "c"  "l" "6"  
##  [4,] "l"  "n" "10" 
##  [5,] "n"  "n" "9"  
##  [6,] "c"  "n" "15" 
##  [7,] "l"  "c" "6"  
##  [8,] "n"  "c" "19" 
##  [9,] "c"  "c" "190"

Invece sotto forma di grafico:

dfp <- data.frame( from = w_table[,1], to=w_table[,2], value=as.numeric(w_table[,3])) 
ggplot(dfp, aes(x=from, y=value, fill =  to)) + 
  geom_bar(stat="identity", position = "dodge",color="black") + 
  scale_fill_manual(values = c("c" =  "#e60800", "l"= "#0033ed","n" = "#ffffff"))

 

Vedendo il grafico salta subito all’occhio che chi compra un libro conservatore o liberale tenda a acquistarne un altro dello stesso schieramento mentre ciò non è vero per quelli neutrali che anzi presentano un maggior numero di archi extra componente.

A conferma di ciò possiamo vedere la percentuale di archi intra componente per ogni schieramento

l_loops <- as.numeric(w_table[1,3])
l_extra <- as.numeric(w_table[4,3]) + as.numeric(w_table[7,3])
n_loops <- as.numeric(w_table[5,3])
n_extra <- as.numeric(w_table[2,3]) + as.numeric(w_table[8,3])
c_loops <- as.numeric(w_table[9,3])
c_extra <- as.numeric(w_table[3,3]) + as.numeric(w_table[6,3])
loops <- c(l_loops, n_loops, c_loops)
extra <- c(l_extra, n_extra, c_extra)
l_table <- cbind( "edges" = (loops+extra), "intra" = loops, "extra" = extra, "%intra" = round(loops/(loops+extra)*100,2 ))
rownames(l_table) <- c("liberal", "neutral", "conservative")
l_table
##              edges intra extra %intra
## liberal        188   172    16  91.49
## neutral         42     9    33  21.43
## conservative   211   190    21  90.05

Effettivamente gli schieramenti liberali e conservatori sono molto chiusi, infatti il numero di archi intra componete è molto superiore a quelli extra componete. Al contrario per i nutrali la situazione è ribaltata, ed è presente anzi una leggerissima preferenza verso i libri conservatori.

d.

Quali sono gli schieramenti che comunicano maggiormente?

Possiamo individuare quali schieramenti comunicano maggiormente tra di loro.

w_tablenl <- w_table[-9,]
w_tablenl <- w_tablenl[-5,]
w_tablenl <- w_tablenl[-1,]
 
dfp2 <- data.frame( from = w_tablenl[,1], to=w_tablenl[,2], value=as.numeric(w_tablenl[,3])) 
ggplot(dfp2, aes(x=from, y=value, fill =  to)) + 
  geom_bar(stat="identity", position = "dodge",color="black") + 
  scale_fill_manual(values = c("c" =  "#e60800", "l"= "#0033ed","n" = "#ffffff"))

 

Gli acquirenti dei libri conservatori tendono a preferire, com’era facile supporre, libri neutrali piuttosto che quelli liberali. Questa tendenza a preferire libri neutrali è presente anche, seppure in modo minore tra i liberali i quali nonstante ciò comprano meno libri neutrali ripsetto a i conservatori. Più interessante la situazione dei neurali, dato che in linea teorica non dovrebbero presentare nessuna propensione verso uno determinato schieramento, però in praticaciò non è vero in quanto chi compra libri neutrali, compra anche con maggiore frequenza libri conservatori piuttosto che liberali.. Possiamo concludere evidenziano come quando si tratta ti acquistare libri di schieramenti differenti dal proprio i neutrali acquistano un numero maggiore di libri rispetto agli altri due schieramenti.

e.

Quali sono i libri che comunicano maggiormente con schieramenti diversi dal proprio?

Possiamo ora entrare maggiormente nel dettaglio e individuare quali sono i libri che inducono il maggior numero di acquisti di libri di schieramenti avversari.

l_idx <- V(g2)[which(V(g)$value=="l")]
n_idx <- V(g2)[which(V(g)$value=="n")]
c_idx <- V(g2)[which(V(g)$value=="c")]

edgesT <- as_tibble(edges)
edges_from_l <- edgesT %>%
                  filter(from %in% l_idx)
from_l_to_n <-  edges_from_l %>%
                  filter(to %in% n_idx)%>% 
                  count(from)

from_l_to_c <-  edges_from_l %>%
                  filter(to %in% c_idx)%>% 
                  count(from)

edges_from_n <- edgesT %>%
                  filter(from %in% n_idx)
from_n_to_l <-  edges_from_n %>%
                  filter(to %in% l_idx)%>% 
                  count(from)
from_n_to_c <-  edges_from_n %>%
                  filter(to %in% c_idx)%>% 
                  count(from)

edges_from_c <- edgesT %>%
                  filter(from %in% c_idx)
from_c_to_l <-  edges_from_c %>%
                  filter(to %in% l_idx)%>% 
                  count(from)
from_c_to_n <-  edges_from_c %>%
                  filter(to %in% n_idx)%>% 
                  count(from)

Liberali

Il libro liberale più acquistato da chi compra libri neutrali è

fltn <- V(g2)$label[from_l_to_n$from[which(from_l_to_n$n==max(from_l_to_n$n))]]
fltnv <- max(from_l_to_n$n)
cbind( "title" = fltn, "degree" = fltnv)
##      title          degree
## [1,] "Rogue Nation" "2"

Mentre i libri liberali più acquistati da chi compra libri conservatori sono:

fltc <- V(g2)$label[from_l_to_c$from[which(from_l_to_c$n==max(from_l_to_c$n))]]
fltcv <- max(from_l_to_c$n)
cbind( "title" = fltc, "degree" = fltcv)
##      title                          degree
## [1,] "The Price of Loyalty"         "2"   
## [2,] "House of Bush, House of Saud" "2"

In entrambi i casi il grado di raccomandazione è comunque abbastanza basso.

Neutrali

Il libro neutrale più acquistato da chi compra libri liberali è

fntl <- V(g2)$label[from_n_to_l$from[which(from_n_to_l$n==max(from_n_to_l$n))]]
fntlv <- max(from_n_to_l$n)
cbind( "title" = fntl, "degree" = fntlv)
##      title            degree
## [1,] "Plan of Attack" "4"

Mentre il libro neutrale più acquistato da chi compra libri conservatori è:

fntc <- V(g2)$label[from_n_to_c$from[which(from_n_to_c$n==max(from_n_to_c$n))]]
fntcv <- max(from_n_to_c$n)
cbind( "title" = fntc, "degree" = fntcv)
##      title               degree
## [1,] "Why America Slept" "5"

Per quanto riguarda i libri neurali com’era facile supporre il grado di raccomandazione è più alto, pari circa al doppio del risultato precedente, in quanto è più probabile che un libro neutrale metta d’accordo entrambi gli schieramenti avversari, secondo quanto visto nei punti precedenti.

Conservatori

Il libro conservatore più acquistato da chi compra libri liberali è

fctl <- V(g2)$label[from_c_to_l$from[which(from_c_to_l$n==max(from_c_to_l$n))]]
fctlv <- max(from_c_to_l$n)
cbind( "title" = fctl, "degree" = fctlv)
##      title                 degree
## [1,] "Rise of the Vulcans" "4"

Interessante osservare che questo libro presenta un grado doppio rispetto alla situazione speculare, nonostante il grado medio per questi due schieramenti si del tutto simile.

Mentre i libri conservaotri più acquistati da chi compra libri liberali sono:

fctn <- V(g2)$label[from_c_to_n$from[which(from_c_to_n$n==max(from_c_to_n$n))]]
fctnv <- max(from_c_to_n$n)
cbind( "title" = fctn, "degree" = fctnv)
##      title                        degree
## [1,] "Charlie Wilson's War"       "2"   
## [2,] "The Man Who Warned America" "2"   
## [3,] "Bush Country"               "2"   
## [4,] "Off with Their Heads"       "2"

Caso inverso

Similmente possiamo individuare quali sono i libri maggiormente acquistati anche grazie al suggerimento d’acquisto di libri di schieramenti diversi dal proprio.

edges_to_l <- edgesT %>%
                  filter(to %in% l_idx)

to_l_from_n <-  edges_to_l %>%
                  filter(from %in% n_idx)%>% 
                  count(to)

to_l_from_c <-  edges_to_l %>%
                  filter(from %in% c_idx)%>% 
                  count(to)


edges_to_n <- edgesT %>%
                  filter(to %in% n_idx)

to_n_from_l <-  edges_to_n %>%
                  filter(from %in% l_idx)%>% 
                  count(to)
to_n_from_c <-  edges_to_n %>%
                  filter(from %in% c_idx)%>% 
                  count(to)


edges_to_c <- edgesT %>%
                  filter(to %in% c_idx)

to_c_from_l <-  edges_to_c %>%
                  filter(from %in% l_idx)%>% 
                  count(to)
to_c_from_n <-  edges_to_c %>%
                  filter(from %in% n_idx)%>% 
                  count(to)

Liberali

Il libro liberale che beneficia maggiormente dal fatto di essere raccomandato da parte dei neutrali è:

tlfn <- V(g2)$label[to_l_from_n$to[which(to_l_from_n$n==max(to_l_from_n$n))]]
tlfnv <- max(to_l_from_n$n)
cbind( "title" = tlfn, "degree" = tlfnv)
##      title                  degree
## [1,] "The Price of Loyalty" "2"

Invece quello raccomandato dai conservatori è:

tlfc <- V(g2)$label[to_l_from_c$to[which(to_l_from_c$n==max(to_l_from_c$n))]]
tlfcv <- max(to_l_from_c$n)
cbind( "title" = tlfc, "degree" = tlfcv)
##      title             degree
## [1,] "America Unbound" "2"

Neutrali

Quello neutrale più con più acquisti grazie ai libri liberali è:

tnfl <- V(g2)$label[to_n_from_l$to[which(to_n_from_l$n==max(to_n_from_l$n))]]
tnflv <- max(to_n_from_l$n)
cbind( "title" = tnfl, "degree" = tnflv)
##      title            degree
## [1,] "Plan of Attack" "6"

Questo è il libro con grado maggiore, ne segue che è il libro con il maggior numero di suggerimento d’acquisto da parte di altri libri non appartenenti al suo schieramento.

Invece quelli conservatori più consigliati dai neutrali sono:

tnfc <- V(g2)$label[to_n_from_c$to[which(to_n_from_c$n==max(to_n_from_c$n))]]
tnfcv <- max(to_n_from_c$n)
cbind( "title" = tnfc, "degree" = tnfcv)
##      title               degree
## [1,] "Why America Slept" "2"   
## [2,] "Ghost Wars"        "2"   
## [3,] "Meant To Be"       "2"   
## [4,] "Power Plays"       "2"   
## [5,] "The Perfect Wife"  "2"   
## [6,] "Plan of Attack"    "2"

Conservatori

Il libro conservatore più acquistato da chi compra libri liberali è:

tcfl <- V(g2)$label[to_c_from_l$to[which(to_c_from_l$n==max(to_c_from_l$n))]]
tcflv <- max(to_c_from_l$n)
cbind( "title" = tcfl, "degree" = tcflv)
##      title         degree
## [1,] "Bush at War" "4"

 

È curioso notare il successo dell’autore Bob Woodward sia con un libro neutrale acquistato spesso dai conservatori, sia con questo libro conservatore acquistato frequentemente da liberali. Mettendo in un certo senso d’accordo sia conservatori che liberali.

I libri conservatori più acquistati da chi ha comprato libri neutrali sono:

tcfn <- V(g2)$label[to_c_from_n$to[which(to_c_from_n$n==max(to_c_from_n$n))]]
tcfnv <- max(to_c_from_n$n)
cbind( "title" = tcfn, "degree" = tcfnv)
##      title                        degree
## [1,] "The Man Who Warned America" "2"   
## [2,] "Dangerous Dimplomacy"       "2"   
## [3,] "Rise of the Vulcans"        "2"

f.

Quali sono gli hub e le authority della rete?

Data la natura del dataset può aver senso trovare i libri che sono Authority e Hub relativamente alla Kleinberg centrality.

Cominciamo con il cercare l’authority della rete, ossia i libri più suggeriti dai libri “hub”.

authScore <- authority_score(g2)$vector
max_auth = which(authScore==max(authScore))
V(g2)$label[max_auth]
## [1] "Bushwhacked"
V(g2)$value[max_auth]
## [1] "l"

barplot(sort(authScore), col = colours[order(authScore)], xaxt='n', ann=FALSE)

 

Dal barplot di può vedere come il grado di authority dei libri liberali si nettamente superiore agli avversari.

g3 = graph_from_data_frame(edges, directed = TRUE, vertices = nodes)
ggraph(g3) +
  geom_edge_link(arrow = arrow(length = unit(2, 'mm'), type = "open"),end_cap = circle(0.5, 'mm'), alpha = 0.4, show.legend = FALSE) +
  geom_node_point(aes(color = value, size = authScore))  +
  theme_graph()

Questo risultato viene confermato dal valore medio ripartito per ogni schieramento.

aS <- data.frame( n = sum(authScore[n_idx])/length(n_idx), c = sum(authScore[c_idx])/length(c_idx), l = sum(authScore[l_idx])/length(l_idx))
aSm <- as.matrix(aS)
barplot(aSm[1,] , col = c("#ffffff", "#e60800", "#0033ed"), names.arg=c("neutral","conservative","liberal"))

 

Troviamo che i libri liberali mediamente hanno un grado di authority molto maggiore agli altri due schieramenti.

Gli Hub invece sono i libri che raccomandano il più alto numero di libri con alto grado di authority. Dalla definizione di hub e dai risultati precedenti, ossia alto livello di authority media dei libri liberali e la struttura della rete molto chiusa per schieramenti, possiamo immaginare a priori che anche in questo caso la situazione sarà simile al punto precedente.

hubScore <- hub_score(g2)$vector
max_hub = which(hubScore==max(hubScore))
V(g2)$label[max_hub]
## [1] "The Price of Loyalty"
V(g2)$value[max_hub]
## [1] "l"

barplot(sort(hubScore), col = colours[order(hubScore)], xaxt='n', ann=FALSE)

 

A una prima occhiata sembra confermata la supposizione.

g3 = graph_from_data_frame(edges, directed = TRUE, vertices = nodes)
ggraph(g3) +
  geom_edge_link(arrow = arrow(length = unit(2, 'mm'), type = "open"),end_cap = circle(0.5, 'mm'), alpha = 0.4, show.legend = FALSE) +
  geom_node_point(aes(color = value, size = hubScore))  +
  theme_graph()

 

Come volevasi dimostrare il risultato è molto simile.

hs <- data.frame( n = sum(hubScore[n_idx])/length(n_idx), c = sum(hubScore[c_idx])/length(c_idx), l = sum(hubScore[l_idx])/length(l_idx))
hsm <- as.matrix(hs)
barplot(hsm[1,] , col = c("#ffffff", "#e60800", "#0033ed"), names.arg=c("neutral","conservative","liberal"))

 

A livello di schieramenti la correlazione tra questi due risultati è abbastanza palese, mentre per i singoli libri è vero che ad un authority alta corrisponda una hubness alta?

plot(authScore,hubScore)

cor.test(authScore,hubScore, method="pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  authScore and hubScore
## t = 3.6446, df = 103, p-value = 0.0004217
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1564469 0.4974208
## sample estimates:
##       cor 
## 0.3379777

Secondo il coefficiente di Pearson è presente una leggera correlazione tra le due, seppure non paragonabile a quella presente a livello di schieramenti.

cor.test(aSm, hsm, method="pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  aSm and hsm
## t = 42.975, df = 1, p-value = 0.01481
## alternative hypothesis: true correlation is not equal to 0
## sample estimates:
##       cor 
## 0.9997294

Possiamo notare una certa correlazione tra il grado di authority e hub presente nei diversi schieramenti, in particolare è interessante notare la discrepanza tra liberali e conservatori in quanto il numero di archi che vanno in in nodo conservatore e quello degli archi che vanno in in nodo liberale è molto simile, così come il numero di archi intracomponente dei due schieramenti.

Limiti e Conclusioni

Purtroppo la quantità di informazioni presenti nel dataset è abbastanza limitata e di conseguenza sono stato costretto a fare alcune assunzioni come ad esempio dato che gli archi non sono pesati ho supposto che abbiano tutti peso unitario, così facendo si perde la sfumatura dell’effettivo volume di libri acquistati. Un altro limite è la mancanza di una definizione temporale d’acquisto che avrebbe permesso oltre ad analizzare le vendite nel tempo anche di raffrontare quanto emerso con i sondaggi e/o risultati delle elezioni di quegli anni.

Com’era facile immaginare la rete presenta molti archi intra componente e pochi extra componente eccezion fatta per la componete neutrale. Emerge quindi che chi compra libri di ideologie conservatrici o liberali tipicamente se acquista un altro libro esso sarà dello stesso schieramento di quello acquistato in principio. Ragionado per schieramenti si può notare come quello liberale risulti vincitore sotto molti punti di vista, tuttavia la faccenda si complica quando si parla di singoli libri non è possibile individuare con precisione quale sia o quali sono i libri che in un certo senso dominano il mercato.